<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<script>
    /*
          // 3.5.1
              ++ --
              +   -
     */

    // 3.5.2 位操作符
    // 1.toString
    let num = -18;
    console.log(num.toString(2))  // -10010

    // 1.~  按位非  (2进制中0变1,1变0)
    // 其实按位非等于取反然后减1,但是用非更快
    let num1 = 25;
    let num2 = ~num1;
    console.log(num2)

    // 2.& 按位与  (都为1才是1)
    // 3.| 按位或  (有1个1就为1,全0位0)
    // 4.^ 按位亦或 (相同为0,不同为1)
    // 5.<< 左移    (乘以2的n次方)
    // 6.>> 有符号右移(除以2的n次方)
    // 7.>>> 无符号右移 (同上,但是会除)
    // 8.!  逻辑非
    /*
         如果操作数是对象，则返回 false。
         如果操作数是空字符串，则返回 true。
         如果操作数是非空字符串，则返回 false。
         如果操作数是数值 0，则返回 true。
         如果操作数是非 0 数值(包括 Infinity)，则返回 false。  如果操作数是 null，则返回 true。
         如果操作数是 NaN，则返回 true。
         如果操作数是 undefined，则返回 true。
     */
    // 9.&& 逻辑与 (注意短路)
    /*
     如果第一个操作数是对象，则返回第二个操作数。
     如果第二个操作数是对象，则只有第一个操作数求值为 true 才会返回该对象。
     如果两个操作数都是对象，则返回第二个操作数。
     如果有一个操作数是 null，则返回 null。
     如果有一个操作数是 NaN，则返回 NaN。
     如果有一个操作数是 undefined，则返回 undefined。
     */

    // 10.|| 逻辑或
    /*
     如果第一个操作数是对象，则返回第一个操作数。
     如果第一个操作数求值为 false，则返回第二个操作数。
     如果两个操作数都是对象，则返回第一个操作数。
     如果两个操作数都是 null，则返回 null。
     如果两个操作数都是 NaN，则返回 NaN。
     如果两个操作数都是 undefined，则返回 undefined。
     */

    // 11. * 乘
    // 12. / 除
    // 13. % 取模
    // 14. ** 指数操作 (3**2 等于Math.pow(3,2))
    // 15. + - > < >= <=
    // 16. == !=
    /*
       如果任一操作数是布尔值，则将其转换为数值再比较是否相等。false 转换为 0，true 转换为 1。
     如果一个操作数是字符串，另一个操作数是数值，则尝试将字符串转换为数值，再比较是否相等。
     如果一个操作数是对象，另一个操作数不是，则调用对象的 valueOf()方法取得其原始值，再
     null 和 undefined 相等。
     null 和 undefined 不能转换为其他类型的值再进行比较。
     如果有任一操作数是 NaN，则相等操作符返回 false，不相等操作符返回 true。记住:即使两
        个操作数都是 NaN，相等操作符也返回 false，因为按照规则，NaN 不等于 NaN。
     如果两个操作数都是对象，则比较它们是不是同一个对象。如果两个操作数都指向同一个对象，
      则相等操作符返回 true。否则，两者不相等。

      特殊
        null == undefined       true
        "NaN" == NaN            false
        5 == NaN                false
        NaN == NaN              false
        NaN != NaN              true
        false == 0              true
        true == 1               true
        true == 2               false
        undefined == 0          false
        null == 0               false
        "5" == 5                true
     */

    // 17. === 不转换类型
    // 18.bool?a:b 条件操作
    // 19. = 赋值
    // 20. , 逗号(let num1 =1,num2 =2)


</script>
</body>
</html>